package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomInteger;
import br.com.telescope.adsrt.dom.DomProperties;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.AdsException;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.adsrt.lib.Form;
import br.com.telescope.sql.ModelQuery;
import br.com.telescope.t2.EntityBinding;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.InsertFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.LookupFeature;
import br.com.telescope.t2.feature.UpdateFeature;
import br.com.telescope.t2.feature.ViewFeature;
import br.com.telescope.util.ObjectUtil;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Varíavéis de aplicativos.
 * <p>
 * Interface para manutenção de Varíavel de aplicativo
 * <P>
 * Telescope origin: ZTEST.CAD_VARIAVEL_APLICATIVO
 * <P>
 * Base entity: ZTEST.VARIAVEL_APLICATIVO
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadVariavelAplicativo extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "ZTEST.CAD_VARIAVEL_APLICATIVO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Varíavéis de aplicativos");
    }
    
    protected EntVariavelAplicativo base;
    protected EntProcessoAplicativo prca;
    protected EntTipoVariavelAplicativo tpvr;
    protected EntVariavelAplicativo rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomId pIdAplicativoOperacao;
    
    // Record items
    private DomUpper aNome;
    private DomText aMascaraValor;
    private DomProperties aValorDefault;
    private DomUpper aUnidadeMedida;
    private DomId aId;
    private DomId aAplicativoOperacaoId;
    private DomId aTipoVariavelAplicativoId;
    private DomUpper aPrcaNome;
    private DomInteger aPrcaSequenciaExecucao;
    private DomUpper aTpvrNome;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select BASE.*"
                + " , PRCA.NOME as PRCA_NOME"
                + " , PRCA.SEQUENCIA_EXECUCAO as PRCA_SEQUENCIA_EXECUCAO"
                + " , TPVR.NOME as TPVR_NOME"
                + " , PRCA.ID as Z_PRCA_ID"
                + " , TPVR.ID as Z_TPVR_ID"
                + " from VARIAVEL_APLICATIVO BASE"
                + " left join PROCESSO_APLICATIVO PRCA on PRCA.ID = BASE.PROCESSO_APLICATIVO_ID"
                + " join TIPO_VARIAVEL_APLICATIVO TPVR on TPVR.ID = BASE.TIPO_VARIAVEL_APLICATIVO_ID";
    }
    
    @Override
    public void initAttributes() {
        
        aNome = new DomUpper();
        aNome.context(ctx).name("NOME").label("Nome da variável");
        
        aMascaraValor = new DomText();
        aMascaraValor.context(ctx).name("MASCARA_VALOR").label("Máscara de valor da variável");
        
        aValorDefault = new DomProperties();
        aValorDefault.context(ctx).name("VALOR_DEFAULT").label("Valor default para a variável");
        
        aUnidadeMedida = new DomUpper();
        aUnidadeMedida.context(ctx).name("UNIDADE_MEDIDA").label("Unidade de medida do valor");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aAplicativoOperacaoId = new DomId();
        aAplicativoOperacaoId.context(ctx).name("APLICATIVO_OPERACAO_ID").label("Aplicativo de operação");
        
        aTipoVariavelAplicativoId = new DomId();
        aTipoVariavelAplicativoId.context(ctx).name("TIPO_VARIAVEL_APLICATIVO_ID").label("Tipo da variável de aplicativo");
        
        aPrcaNome = new DomUpper();
        aPrcaNome.context(ctx).name("PRCA_NOME").label("Nome do processo");
        aPrcaNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from PROCESSO_APLICATIVO PRCA)", "q"));
        aPrcaNome.setAutocompleteLength(2);
        
        aPrcaSequenciaExecucao = new DomInteger();
        aPrcaSequenciaExecucao.context(ctx).name("PRCA_SEQUENCIA_EXECUCAO").label("Sequência de execução");
        aPrcaSequenciaExecucao.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT SEQUENCIA_EXECUCAO as valor"
                + " , SEQUENCIA_EXECUCAO as pesquisar"
                + " , SEQUENCIA_EXECUCAO as descricao"
                + " from PROCESSO_APLICATIVO PRCA)", "q"));
        aPrcaSequenciaExecucao.setAutocompleteLength(2);
        
        aTpvrNome = new DomUpper();
        aTpvrNome.context(ctx).name("TPVR_NOME").label("Nome do tipo de variável");
        aTpvrNome.setListOfValuesQuery(createQuery()
                .select("*")
                .from("(SELECT NOME as valor"
                + " , NOME as pesquisar"
                + " , NOME as descricao"
                + " from TIPO_VARIAVEL_APLICATIVO TPVR)", "q"));
        aTpvrNome.setAutocompleteLength(0);
        
    }
    
    @Override
    public void initParameters() {
        pIdAplicativoOperacao = new DomId(ctx, "ID_APLICATIVO_OPERACAO", "Aplicativo de operação");
        pIdAplicativoOperacao.setValue(ctx.getParameter("P_ID_APLICATIVO_OPERACAO"));
        pIdAplicativoOperacao.setSqlExpression("APLICATIVO_OPERACAO_ID");
        if (pIdAplicativoOperacao.isNotNull()) {
            aAplicativoOperacaoId.setValue(pIdAplicativoOperacao.getValue());
        }
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pIdAplicativoOperacao);
        }
        return allParameters;
    }
    
    @Override
    public void copyBindParameters() {
        EntVariavelAplicativo record = getRecord();
        if (pIdAplicativoOperacao.isNotNull()) {
            record.setAplicativoOperacaoId(pIdAplicativoOperacao.getValue());
        }
    }
    
    @Override
    public void retrieveBindParameters() {
        pIdAplicativoOperacao.setValue(getRecord().valueOfAplicativoOperacaoId());
    }
    
    @Override
    public void initEntityBindings() {
        EntityBinding binding;
        
        binding = new EntityBinding("ZTEST.PROCESSO_APLICATIVO", "PRCA", "Z_PRCA_ID", "ZTEST.CAD_PROCESSO_APLICATIVO.VIEW");
        binding.addFields(aPrcaNome, aPrcaSequenciaExecucao);
        entityBindings.add(binding);
        
        binding = new EntityBinding("ZTEST.TIPO_VARIAVEL_APLICATIVO", "TPVR", "Z_TPVR_ID", "ZTEST.CAD_TIPO_VARIAVEL_APLICATIVO.VIEW");
        binding.addFields(aTpvrNome);
        entityBindings.add(binding);
    }
    
    @Override
    public String getQueryPkColumn() {
        return "BASE.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntVariavelAplicativo getRecord() {
        if (base == null) {
            base = new EntVariavelAplicativo(ctx);
            rec = base;
        }
        return this.base;
    }
    
    @Override
    public String getContextName() {
        return aNome.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "NOME, TPVR_NOME, PRCA_NOME, MASCARA_VALOR";
    }
    
    @Override
    public void translateInsertFks(Form form) {
        ModelQuery query;
        
        // PROCESSO_APLICATIVO_ID
        try {
            if (form.hasFields("PRCA_NOME")) {
                query = createQuery()
                        .select("PRCA.ID")
                        .from("PROCESSO_APLICATIVO", "PRCA")
                        .filter("PRCA.NOME", form.get("PRCA_NOME"))
                        ;
                base.setProcessoAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // TIPO_VARIAVEL_APLICATIVO_ID
        try {
            if (form.hasFields("TPVR_NOME")) {
                query = createQuery()
                        .select("TPVR.ID")
                        .from("TIPO_VARIAVEL_APLICATIVO", "TPVR")
                        .filter("TPVR.NOME", form.get("TPVR_NOME"))
                        ;
                base.setTipoVariavelAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    
    @Override
    public void translateUpdateFks(Form form) {
        ModelQuery query;
        
        // PROCESSO_APLICATIVO_ID
        try {
            if (form.hasFields("PRCA_NOME")) {
                query = createQuery()
                        .select("PRCA.ID")
                        .from("PROCESSO_APLICATIVO", "PRCA")
                        .filter("PRCA.NOME", form.get("PRCA_NOME"))
                        ;
                base.setProcessoAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
        
        // TIPO_VARIAVEL_APLICATIVO_ID
        try {
            if (form.hasFields("TPVR_NOME")) {
                query = createQuery()
                        .select("TPVR.ID")
                        .from("TIPO_VARIAVEL_APLICATIVO", "TPVR")
                        .filter("TPVR.NOME", form.get("TPVR_NOME"))
                        ;
                base.setTipoVariavelAplicativoId(ObjectUtil.toLong(translateFk(query)));
            }
        } catch (AdsException ex) {
            throw new RuntimeException(ex);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aTpvrNome, "view");
            addField(aPrcaNome, "view");
            addField(aMascaraValor, "view");
            addField(aValorDefault, "view");
            addField(aUnidadeMedida, "view");
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="VIEW">
    public class FView extends ViewFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aTpvrNome, "view");
            addField(aPrcaNome, "view");
            addField(aPrcaSequenciaExecucao, "view");
            addField(aMascaraValor, "view");
            addField(aValorDefault, "view");
            addField(aUnidadeMedida, "view");
        }
        
        {
            setFeatureName("VIEW");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends InsertFeature {
        
        @Override
        public void initForm() {
            aNome.setOptional(false);
            addField(aNome, "rqd");
            aTpvrNome.setOptional(false);
            addField(aTpvrNome, "rqd");
            addField(aPrcaNome, "opt");
            aPrcaSequenciaExecucao.setEditable(false);
            addField(aPrcaSequenciaExecucao, "view");
            addField(aMascaraValor, "opt");
            addField(aValorDefault, "opt");
            addField(aUnidadeMedida, "opt");
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends UpdateFeature {
        
        @Override
        public void initForm() {
            aNome.setOptional(false);
            addField(aNome, "rqd");
            aTpvrNome.setOptional(false);
            addField(aTpvrNome, "rqd");
            addField(aPrcaNome, "opt");
            aPrcaSequenciaExecucao.setEditable(false);
            addField(aPrcaSequenciaExecucao, "view");
            addField(aMascaraValor, "opt");
            addField(aValorDefault, "opt");
            addField(aUnidadeMedida, "opt");
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aNome, "view");
            addField(aTpvrNome, "view");
            addField(aPrcaNome, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="PRCA_NOME_LOOKUP">
    public class FPrcaNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aPrcaNome.setEditable(true);
            addField(aPrcaNome, "opt");
            aPrcaSequenciaExecucao.setEditable(false);
            addField(aPrcaSequenciaExecucao, "view");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("PRCA.NOME as PRCA_NOME")
                    .select("PRCA.SEQUENCIA_EXECUCAO as PRCA_SEQUENCIA_EXECUCAO")
                    .from("PROCESSO_APLICATIVO", "PRCA")
                    ;
        }
        
        {
            setFeatureName("PRCA_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="TPVR_NOME_LOOKUP">
    public class FTpvrNomeLookup extends LookupFeature {
        
        @Override
        public void initForm() {
            aTpvrNome.setEditable(true);
            addField(aTpvrNome, "opt");
        }
        
        @Override
        public ModelQuery getLookupQuery() {
            return createQuery()
                    .select("TPVR.NOME as TPVR_NOME")
                    .from("TIPO_VARIAVEL_APLICATIVO", "TPVR")
                    ;
        }
        
        {
            setFeatureName("TPVR_NOME_LOOKUP");
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FList());
        addFeature(new FView());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FPrcaNomeLookup());
        addFeature(new FTpvrNomeLookup());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "LIST";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getNome() {
        return aNome.getValue();
    }
    
    public void setNome(String value) {
        this.aNome.setValue(value);
    }
    
    public String getMascaraValor() {
        return aMascaraValor.getValue();
    }
    
    public void setMascaraValor(String value) {
        this.aMascaraValor.setValue(value);
    }
    
    public String getValorDefault() {
        return aValorDefault.getValue();
    }
    
    public void setValorDefault(String value) {
        this.aValorDefault.setValue(value);
    }
    
    public String getUnidadeMedida() {
        return aUnidadeMedida.getValue();
    }
    
    public void setUnidadeMedida(String value) {
        this.aUnidadeMedida.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public Long getAplicativoOperacaoId() {
        return aAplicativoOperacaoId.getValue();
    }
    
    public void setAplicativoOperacaoId(Long value) {
        this.aAplicativoOperacaoId.setValue(value);
    }
    
    public Long getTipoVariavelAplicativoId() {
        return aTipoVariavelAplicativoId.getValue();
    }
    
    public void setTipoVariavelAplicativoId(Long value) {
        this.aTipoVariavelAplicativoId.setValue(value);
    }
    
    public String getPrcaNome() {
        return aPrcaNome.getValue();
    }
    
    public void setPrcaNome(String value) {
        this.aPrcaNome.setValue(value);
    }
    
    public Integer getPrcaSequenciaExecucao() {
        return aPrcaSequenciaExecucao.getValue();
    }
    
    public void setPrcaSequenciaExecucao(Integer value) {
        this.aPrcaSequenciaExecucao.setValue(value);
    }
    
    public String getTpvrNome() {
        return aTpvrNome.getValue();
    }
    
    public void setTpvrNome(String value) {
        this.aTpvrNome.setValue(value);
    }
    
    public Long getParameterIdAplicativoOperacao() {
        return pIdAplicativoOperacao.getValue();
    }
    
    public void setParameterIdAplicativoOperacao(Long value) {
        pIdAplicativoOperacao.setValue(value);
        aAplicativoOperacaoId.setValue(value);
    }
    // </editor-fold>
    
    
    @Override
    public String getJsServiceFile() {
        return "ui/ztest/cad_variavel_aplicativo.js";
    }
}
